#pragma once

#include <QObject>
#include <QHash>
#include <QList>
#include <memory>
#include "area.h"
#include "kernel/interfaces/ILogger.h"

namespace application {
namespace area {

/**
 * @brief 区域管理器
 * @details 管理单个楼层地图的所有区域
 */
class AreaManager : public QObject {
    Q_OBJECT

public:
    explicit AreaManager(int floor, std::shared_ptr<kernel::ILogger> logger = nullptr, QObject* parent = nullptr);
    ~AreaManager() = default;

    // 区域管理
    void addArea(std::shared_ptr<Area> area);
    void removeArea(const QString& areaId);
    std::shared_ptr<Area> getArea(const QString& areaId) const;

    // 查询
    bool hasArea(const QString& areaId) const;
    QList<QString> getAllAreaIds() const;
    int getFloor() const { return m_floor; }
    std::shared_ptr<Area> findAreaContainingPoint(const kernel::Position& position) const;

    // 区域操作
    void enterArea(const QString& areaId, int agvId);
    void exitArea(const QString& areaId, int agvId);

    // 初始化
    void initializeAreas();

signals:
    void areaAdded(const QString& areaId);
    void areaRemoved(const QString& areaId);
    void areaOccupationChanged(const QString& areaId);
    void areaEntered(const QString& areaId, int agvId);
    void areaExited(const QString& areaId, int agvId);

private:
    int m_floor;
    QHash<QString, std::shared_ptr<Area>> m_areas;
    std::shared_ptr<kernel::ILogger> m_logger;
};

} // namespace area
} // namespace application
